òɾۿûѧϰʹá
ԭַhttps://www.joinquant.com/post/12143

ԭһ˵ʽ鵽ԭĺ߽ۡ


ԭĲԴ£

# ¡Ծۿ£https://www.joinquant.com/post/570
# ⣺򵥵ĶʱԡǸ̨ŶӵĺӣҸ㽲
# ߣСס

def initialize(context):
    g.stock = ['600196.XSHG']
    set_benchmark('600196.XSHG')
    g.month = context.current_dt.month
    g.stock_grade = [0]
    g.mavg5 = [0]
    g.mavg10 = [0]
    g.mavg20 = [0]
    g.mavg30 = [0]
    g.mavg60 = [0]
    g.mavg180 = [0]
    g.cash = 20000

# Ʊȥnλʱ䣨һ죩ֵ
def caculate_mavg(stock,n):
    return history(n, '1d', 'close', [stock],df = False)[stock].mean()

# õҪĶ
def evaluate_by_mavg(stock):
   mavg5 = caculate_mavg(stock,5)
   g.mavg5.append(mavg5)
   mavg10 = caculate_mavg(stock,10)
   g.mavg10.append(mavg10)
   mavg20 = caculate_mavg(stock,20)
   g.mavg20.append(mavg20)
   mavg30 = caculate_mavg(stock,30)
   g.mavg30.append(mavg30)
   return None

# ж϶ͷ
def is_highest_point(data,stock,n):
    if len(g.mavg10)>2:
        price = data[stock].price
        if g.mavg5[n] > g.mavg10[n]\
        and g.mavg10[n] > g.mavg20[n]\
        and g.mavg20[n] > g.mavg30[n]:
            return True
    return False

# жϿͷСղ
def is_lowest_point(data,stock,n):
    if len(g.mavg10)>2:
        price = data[stock].price
        if g.mavg5[n] < g.mavg10[n]\
        and g.mavg10[n] < g.mavg20[n]:
            return True
    return False
    
# ж϶ͷк桪
def is_crossDOWN(data,stock,mavg1,mavg2):
    if len(mavg2)>2 and is_highest_point(data,stock,-2)\
    and is_highest_point(data,stock,-3):
        if mavg1[-2] > mavg2[-2]\
        and mavg1[-1] < mavg2[-1]:
            return True
    return False

# жϿͷкĽ桪
def is_crossUP(data,stock,mavg1,mavg2):
    if len(mavg2)>2 and is_lowest_point(data,stock,-2)\
    and is_lowest_point(data,stock,-3):
        if mavg1[-2] < mavg2[-2]\
        and mavg1[-1] > mavg2[-1]:
            return True
    return False

# жϾ߾
def is_struggle(mavg1,mavg2,mavg3):
    if abs((mavg1[-1]-mavg2[-1])/mavg2[-1])< 0.003\
    or abs((mavg2[-1]-mavg3[-1])/mavg3[-1])< 0.002:
        return True
    return False

def handle_data(context, data):
    for stock in g.stock:
        evaluate_by_mavg(stock)
        price = data[stock].price
        # ͷС
        if is_highest_point(data,stock,-1) and context.portfolio.positions_value ==0:
            # ߾ʱ
            if is_struggle(g.mavg10,g.mavg20,g.mavg30):
                continue
            else:
                order_target_value(stock,g.cash)
        # ͷС
        elif is_lowest_point(data,stock,-1):
            order_target_value(stock,0)
        # ͷк桪
        if is_crossDOWN(data,stock,g.mavg5,g.mavg10):
            order_target_value(stock,0)
        # ͷк桪
        elif is_crossUP(data,stock,g.mavg10,g.mavg20) and context.portfolio.positions_value ==0:
            order_target_value(stock,g.cash)
    record(mavg5 = g.mavg5[-1])
    record(mavg10 = g.mavg10[-1])
    record(mavg20 = g.mavg20[-1])
    record(mavg30 = g.mavg30[-1])